iT邦幫忙

2023 iThome 鐵人賽

DAY 15
0
自我挑戰組

ESP32 Micropython 從入門到實用系列 第 15

15.PWM (Pulse-width modulation) 模組

  • 分享至 

  • xImage
  •  

我們從 Wiki 上來查一下 PWM
我想這其中的解釋會讓您看到懷疑人生!轉成中文繁體版 wiki 的解釋也是看不懂!
先不管那些複雜的解釋內文,我們先來看看在英文版 wiki 中有下面這張圖:

https://upload.wikimedia.org/wikipedia/commons/b/b8/Duty_Cycle_Examples.png

至少看到最上面那個波形,跟我們前面幾天前學到的 LED 閃爍的波形很像!!沒錯,我們再把那個程式列在下面:

import time
from machine import Pin
P1 = Pin(1, Pin.OUT)

while True:
    P1.value(not P1.value())
    time.sleep(1)

on 1 秒, off 1 秒。我們在這裡引入一個新名詞,總共一個週期是 2 秒,on 的時間 1 秒,佔了 50% 的週期時間,因此我們稱爲是 50% duty cycle,duty cycle 我們這裡翻譯爲工作週期,大陸翻譯爲佔空比 (duty ratio),指的是 50% 這個比值。

其實上面的例子是已經優化了的程式碼,比較循序思維邏輯的程式碼像這樣:

import time
from machine import Pin
P1 = Pin(1, Pin.OUT)

On_time = 500
Off_time = 500

while True:
    P1.value(1) # On
    time.sleep_us(On_time)
    P1.value(0) # Off
    time.sleep_us(Off_time)

一樣的,我們把 LED 接在 P1,這個程式產生 1000 Hz的波形,週期時間是 1 ms, on 的時間是 0.5 ms,off 的時間也是 0.5 ms,這個波形是 50% duty cycle。

若把 On_time 改成 750, Off_time 改成 250 ,這時候變成上圖中的 75% duty cycle 了。

同樣的:把 On_time 改成 250, Off_time 改成 750, 成爲 25% duty cycle。
請您再觀察一下,75% duty cycle 是否 LED 更亮了?而 25% duty cycle 是否 LED 變暗了呢?

那什麼是 PWM 呢,我們可以這樣理解,若是一個由 on/off 所組成的脈衝,根據其 duty cycle 的大小,代表著不同的訊息,那我們可以稱爲是 PWM (脈衝寬度調變),例如上面的例子,duty cycle 的寬度可以代表着 LED 燈的亮度大小!常用的例子爲:用脈衝寬度來代表著(變頻馬達)轉速大小,或是用來代表相機雲台(伺服馬達)旋轉的角度等等,PWM 應用的場域非常的多。

根據這樣的亮度變化,我們可以製作一個呼吸燈,程式如下:

import time
from machine import Pin
P1 = Pin(1, Pin.OUT)

def led_show(pin, on_time, off_time):
    pin.value(1) # On
    time.sleep_us(on_time)
    pin.value(0) # Off
    time.sleep_us(off_time)

while True:
    for i in range(0,11,1): # 漸亮
        t0 = time.ticks_ms() # 把當下的時間記錄下來
        while (time.ticks_ms() - t0 < 100): # 用新當下時間 減去 舊時間,判斷是否達到 100 ms
            led_show(P1, i*100, 1000-i*100)
    for i in range(10,-1,-1): # 漸暗
        t0 = time.ticks_ms()
        while (time.ticks_ms() - t0 < 100):
            led_show(P1, i*100, 1000-i*100)

這個程式漸亮 LED 再漸暗 LED,但離一個完美的呼吸燈還有待改善,尤其是那種呼吸的感覺,或許您可以動手改一改!

硬體 PWM

我們可以發現 PWM 可以用來調整 LED 的亮度,當然,以後我們也可以用來調整 風扇馬達 的轉速。但從這個呼吸燈實際的例子看起來,要控制這個燈,程式非常忙碌,也很難再做其它事,否則會影響到時序,因此在像 ESP32 這樣的 MCU,通常已整合了 硬體PWM 功能,換句話說,將這樣的功能用硬體來實現,來降低軟體的複雜度,也方便使用。

而在 Micropython 也有程式庫模組(machine.PWM)來使用 ESP32 內建的 PWM 硬體。

我們把 1000 Hz LED燈閃爍的例子改成用 PWM 的方式:

from machine import Pin, PWM
pwm0 = PWM(Pin(1), freq = 1000, duty=512)

變成只有兩行,是不是變成非常容易了呢?而且硬體是在背景中執行,釋放 ESP32 MCU 可以用來做其它事。

現在,您是否已經準備好了來挑戰: 用 Micropython PWM module 來改寫呼吸燈了呢? :)

最後,記得用邏輯分析儀量測一下波形,看看 硬體實現的 PWM 是否有比較好?


上一篇
14.探討模組的使用
下一篇
16. GPIO輸入彈跳處理
系列文
ESP32 Micropython 從入門到實用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言